from flask import Flask, request, render_template, redirect, url_for, flash
import cv2
import tensorflow as tf
import numpy as np
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)
app.secret_key = "super secret key"
app.config['UPLOAD_FOLDER'] = 'uploads/'

if not os.path.exists(app.config['UPLOAD_FOLDER']):
    os.makedirs(app.config['UPLOAD_FOLDER'])


# Load model
model = tf.keras.models.load_model("models/hzw123_cnn_fv.h5")
class_names =['一', '七', '万', '三', '上', '下', '不', '世', '业', '东', '两', '个', '中', '为', '义', '之', '乌', '乐', '乔',
               '九', '书', '乱', '了', '二', '亏', '五', '交', '亦', '亲', '人', '仕', '他', '休', '会', '伴', '住', '何', '你',
               '信', '修', '倚', '做', '先', '光', '全', '八', '六', '共', '其', '写', '冷', '几', '凤', '出', '刀', '分', '刘',
               '初', '到', '刻', '前', '剩', '割', '劝', '包', '十', '千', '压', '厚', '去', '双', '取', '受', '口', '古', '句',
               '可', '各', '合', '君', '听', '吹', '命', '哭', '唐', '唱', '喜', '四', '回', '在', '场', '坐', '增', '声', '壹',
               '处', '多', '夜', '大', '天', '夫', '头', '奈', '奉', '女', '好', '如', '妹', '姑', '娘', '嫂', '子', '字', '安',
               '定', '宝', '室', '害', '家', '宾', '对', '寿', '将', '小', '少', '尝', '尺', '尽', '尾', '层', '屋', '山', '岩',
               '工', '左', '年', '并', '庄', '开', '归', '当', '徕', '得', '心', '志', '忙', '念', '怕', '思', '恨', '悲', '情',
               '惊', '想', '愁', '意', '成', '我', '戒', '所', '扇', '手', '才', '把', '拜', '挂', '接', '提', '数', '文', '断',
               '新', '方', '无', '日', '早', '时', '明', '昔', '星', '春', '曰', '曲', '月', '有', '望', '未', '本', '杀', '来',
               '枉', '林', '树', '桥', '梅', '楼', '欢', '歌', '正', '此', '步', '母', '每', '毑', '气', '水', '没', '河', '油',
               '法', '洞', '满', '火', '点', '烟', '烧', '焦', '然', '照', '爱', '父', '爹', '独', '玉', '王', '珠', '生', '用',
               '田', '甲', '申', '电', '男', '痛', '白', '百', '盘', '看', '眼', '着', '石', '祖', '福', '秀', '秋', '移', '空',
               '窗', '立', '笔', '算', '箱', '红', '结', '给', '罗', '羊', '老', '胡', '般', '良', '色', '花', '落', '藕', '衣',
               '西', '见', '解', '言', '请', '谢', '贤', '贫', '贵', '赵', '跨', '路', '转', '轻', '辞', '边', '过', '还', '远',
               '连', '逼', '道', '郎', '里', '重', '量', '金', '错', '长', '门', '院', '隐', '难', '雁', '非', '飘', '食', '香',
               '高', '鱼', '鸟', '黄', '黑']

@app.route('/', methods=['GET', 'POST'])
def upload_image():
    if request.method == 'POST':
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file:
            filename = secure_filename(file.filename)
            file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(file_path)
            result = process_image(file_path)
            flash('识别到该文字为: ' + result)
            return redirect(url_for('upload_image'))
    return render_template('upload.html')

def process_image(file_path):
    img = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)
    img_resized = cv2.resize(img, (50, 50))
    img_rgb = cv2.cvtColor(img_resized, cv2.COLOR_GRAY2RGB)
    img = np.asarray(img_rgb)
    img = img.reshape(1, 50, 50, 3)  # Reshape for model
    outputs = model.predict(img)
    result_index = int(np.argmax(outputs))
    result = class_names[result_index]
    return result

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)
